<%@ page import="java.math.BigInteger" %>
<%@ page import="java.util.Date" %>
<%@ page import="java.util.Random" %>
<%@ page import="java.util.zip.CRC32" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
    <title>Mybatis分页插件 - 测试页面</title>
    <style type="text/css">
        * {
            margin: 0;
        }

        html, body {
            height: 100%;
        }

        .wrapper {
            min-height: 100%;
            height: auto !important;
            height: 100%;
            margin: 0 auto -155px;
        }

        .footer, .push {
            height: 155px;
        }

        table.gridtable {
            font-family: verdana, arial, sans-serif;
            font-size: 11px;
            color: #333333;
            border-width: 1px;
            border-color: #666666;
            border-collapse: collapse;
            margin: 5px auto;
        }

        table.gridtable th {
            border-width: 1px;
            padding: 8px;
            border-style: solid;
            border-color: #666666;
            background-color: #dedede;
        }

        table.gridtable td {
            border-width: 1px;
            padding: 8px;
            border-style: solid;
            border-color: #666666;
            background-color: #ffffff;
        }

        .middle {
            text-align: center;
            margin: 0 auto;
            width: 600px;
            height: auto;
        }

        .info {
            font-size: 12px;
            text-align: center;
            line-height: 20px;
            padding: 40px;
        }

        .info a {
            margin: 0 10px;
            text-decoration: none;
            color: green;
        }
    </style>
    <%!
        short getCRC(String s, int i, byte bytes[]) {
            CRC32 crc32 = new CRC32();
            if (s != null) {
                for (int j = 0; j < s.length(); j++) {
                    char c = s.charAt(j);
                    crc32.update(c);
                }
            }
            crc32.update(i);
            crc32.update(i >> 8);
            crc32.update(i >> 16);
            crc32.update(i >> 24);
            for (int k = 0; k < bytes.length - 2; k++) {
                byte byte0 = bytes[k];
                crc32.update(byte0);
            }
            return (short) (int) crc32.getValue();
        }

        public String encodeGroups(BigInteger biginteger) {
            BigInteger beginner1 = BigInteger.valueOf(0x39aa400L);
            StringBuilder sb = new StringBuilder();
            for (int i = 0; biginteger.compareTo(BigInteger.ZERO) != 0; i++) {
                int j = biginteger.mod(beginner1).intValue();
                String s1 = encodeGroup(j);
                if (i > 0) {
                    sb.append("-");
                }
                sb.append(s1);
                biginteger = biginteger.divide(beginner1);
            }
            return sb.toString();
        }

        public String encodeGroup(int i) {
            StringBuilder sb = new StringBuilder();
            for (int j = 0; j < 5; j++) {
                int k = i % 36;
                char c;
                if (k < 10) {
                    c = (char) (48 + k);
                } else {
                    c = (char) ((65 + k) - 10);
                }
                sb.append(c);
                i /= 36;
            }
            return sb.toString();
        }

        public String MakeKey(String name, int days, int id, byte version) {
            id %= 100000;
            byte bkey[] = new byte[12];
            bkey[0] = (byte) 1; // Product type: IntelliJ IDEA is 1
            bkey[1] = version; // version
            Date d = new Date();
            long ld = (d.getTime() >> 16);
            bkey[2] = (byte) (ld & 255);
            bkey[3] = (byte) ((ld >> 8) & 255);
            bkey[4] = (byte) ((ld >> 16) & 255);
            bkey[5] = (byte) ((ld >> 24) & 255);
            days &= 0xffff;
            bkey[6] = (byte) (days & 255);
            bkey[7] = (byte) ((days >> 8) & 255);
            bkey[8] = 105;
            bkey[9] = -59;
            bkey[10] = 0;
            bkey[11] = 0;
            int w = getCRC(name, id % 100000, bkey);
            bkey[10] = (byte) (w & 255);
            bkey[11] = (byte) ((w >> 8) & 255);
            BigInteger pow = new BigInteger("89126272330128007543578052027888001981", 10);
            BigInteger mod = new BigInteger("86f71688cdd2612ca117d1f54bdae029", 16);
            BigInteger k0 = new BigInteger(bkey);
            BigInteger k1 = k0.modPow(pow, mod);
            String s0 = Integer.toString(id);
            String sz = "0";
            while (s0.length() != 5) {
                s0 = sz.concat(s0);
            }
            s0 = s0.concat("-");
            String s1 = encodeGroups(k1);
            s0 = s0.concat(s1);
            return s0;
        }

        public String key(String username, byte version) {
            return MakeKey(username, 0, new Random().nextInt(100000), version);
        }
    %>

    <%
        String username = request.getParameter("username");
        if (username != null) {
            String version = request.getParameter("version");
            if (version == null || version.equals("")) {
                version = "14";
            }
            request.setAttribute("username", username);
            request.setAttribute("version", version);
            request.setAttribute("key", key(username, Byte.parseByte(version)));
        }
    %>
</head>
<body>
<div class="wrapper">
    <div class="middle">
        <form action="key.jsp" method="post">
            <h1 style="padding: 150px 0 20px;">生成IDEA
                <select name="version" style="font-size: 28px; border: none; font-weight: bold;">
                    <option value="13" <c:if test="${version=='13'}">selected="selected" </c:if>>13</option>
                    <option value="14" <c:if test="${version=='14'}">selected="selected" </c:if>>14</option>
                </select>
                Key
            </h1>
            <table class="gridtable" style="width:100%;">
                <tr>
                    <th>用户名：</th>
                    <td><input type="text" name="username" value="${username}" style="padding:0 10px;"/></td>
                    <td><input type="submit" value="生成Key"/></td>
                </tr>
                <tr>
                    <th>Key:</th>
                    <td colspan="2"><input type="text" name="key" value="${key}" style="width:426px;padding:0 10px;"/>
                    </td>
                </tr>
            </table>
        </form>
    </div>
    <div class="push"></div>
</div>
<div class="footer">
    <div class="info">
    </div>
</div>
</body>
</html>
